package com.warm.base.design.b_visitor;

/**
 * @Date: 2019/11/27 15:08
 * @Author: LChuang
 * @Description: 访问者模式 (行为型)
 *
 *    表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。
 *
 *    对象结构比较稳定，但经常需要在此对象结构上定义新的操作。
 *    需要对一个对象结构中的对象进行很多不同的并且不相关的操作，而需要避免这些操作“污染”这些对象的类，也不希望在增加新操作时修改这些类
 */
public class Client {
    /**
     * Visitor ：接口或者抽象类，定义了对每个 Element 访问的行为，它的参数就是被访问的元素，它的方法个数理论上与元素的个数是一样的，因此，访问者模式要求元素的类型要稳定，如果经常添加、移除元素类，必然会导致频繁地修改 Visitor 接口，如果出现这种情况，则说明不适合使用访问者模式。
     * ConcreteVisitor ：具体的访问者，它需要给出对每一个元素类访问时所产生的具体行为。
     * Element ：元素接口或者抽象类，它定义了一个接受访问者（accept）的方法，其意义是指每一个元素都要可以被访问者访问。
     * ConcreteElement ：具体的元素类，它提供接受访问的具体实现，而这个具体的实现，通常情况下是使用访问者提供的访问该元素类的方法。
     * ObjectStructure：定义当中所提到的对象结构，对象结构是一个抽象表述，它内部管理了元素集合，并且可以迭代这些元素提供访问者访问。
     */
    public static void main(String[] args) {
        ObjectStructure structure = new ObjectStructure();
        structure.show(new ConcreteVisitorA());
        structure.show(new ConcreteVisitorB());
    }
}
